package com.vecspace.dayu.code.template.service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;
import com.vecspace.dayu.code.consts.TerminalType;
import com.vecspace.dayu.code.template.dao.TemplatePageLayoutDao;
import com.vecspace.dayu.code.template.pojo.CodeTemplate;
import com.vecspace.dayu.code.template.pojo.TemplatePageLayout;
import com.vecspace.dicttable.CodeItem;
import com.vecspace.dicttable.DictAll;
import com.vecspace.exception.HException;
import com.vecspace.utils.NumberUtil;

/**功能描述 页面布局类型的增、删、改查等业务操作的service类
 * @author wanghua
 */
@Service("dayu_templatePageLayoutService")
public class TemplatePageLayoutService {
	/** 根据ID查询 页面布局类型 
	 * @param id   主键值
	 * @return TemplatePageLayout
	 * @throws Exception
	 * @author wanghua
	 */
	public TemplatePageLayout getTemplatePageLayout(Long id) throws Exception{
		return templatePageLayoutDao.getTemplatePageLayout(id);
	}
	
	public List<TemplatePageLayout> getTemplatePageLayouts(String terminalType) throws Exception {
		return templatePageLayoutDao.getTemplatePageLayouts(terminalType);
	}

	/**获取pagelayoutId下已经定义的代码类型
	 * 
	 * @param pagelayoutId
	 * @param containsCommon  是否包含通用布局下的代码
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 * @reviewer  
	 * @createTime 2021年9月20日 下午5:45:44
	 */
	public List<CodeItem> getCodeTypes(Long pagelayoutId, boolean containsCommon) throws Exception{
		//从DAYU_CODE_TEMPLATE 获取pagelayoutId布局下包含的源代码文件类型
		List<String> codeTypes1 = codeTemplateService.getCodeTypes(pagelayoutId);
		
		if(containsCommon) {
			List<TemplatePageLayout> pageLayouts = templatePageLayoutDao.getTemplatePageLayouts(TerminalType.COMMON);
			for(TemplatePageLayout layout : pageLayouts) {
				List<String> codeTypes0 = codeTemplateService.getCodeTypes(layout.getId());
				for(String codeType0 : codeTypes0) {
					if(!codeTypes1.contains(codeType0)) {//去重
						codeTypes1.add(codeType0);
					}
				}
			}
		}

		//将codeTypes1从String转为CodeItem类型
		List<CodeItem> codeTypes2 = DictAll.getItems(CodeTemplate.CODE_TYPE);
		List<CodeItem> codeTypes = codeTypes1.stream().map(codeType->{
			CodeItem codeItem = codeTypes2.stream().filter(it->it.getCode().equals(codeType)).findFirst().orElseGet(null);
			if(codeItem == null) {
				codeItem = new CodeItem(codeType, codeType);
			}
			return codeItem;
		}).collect(Collectors.toList());

		return codeTypes;
	}
		
	/***将页面上传入的对象转为持久化对象（如果页面对象是一个新对象，则insert;否则从数据库库查询出已有的对象item2，将传入的值赋值给item2，然后将item2 update到数据库）
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return TemplatePageLayout
	 * @throws Exception
	 * @author wanghua
	 */
	public TemplatePageLayout saveViewTemplatePageLayout(TemplatePageLayout item, String loginUserId) throws Exception {
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象的页面传值进行校验，如必填项，格式等 ***/
		//Assert.throwz(StringUtils.isNotBlank() , "条件不满足时抛出异常");		
		/*** 结束校验 ***/
		
		TemplatePageLayout item2;
		if (NumberUtil.isNotNullZero(item.getId())) {
			/**从数据库中取出原始对象，将从页面传过来的新值赋值给原始对象，并将原始对象再保存到数据库中 **/
			item2 = getTemplatePageLayout(item.getId());
			if (item2 != null) {				
				if("ADMIN".equals(item2.getCreateUser()))throw new HException("内置布局不能编辑");
				
				/*** 将页面上的新值逐一赋值，不在页面上的属性不要进行赋值 ***/
				item2.setLayoutName(item.getLayoutName());//更新页面布局名称
				item2.setImgPath(item.getImgPath());//更新缩略图路径
				item2.setOrdnum(item.getOrdnum());//更新顺序号
				item2.setStatus(item.getStatus());//0不可用，1可用
				item2.setCreateUser(item.getCreateUser());//更新记录创建人ID

				/**end**/
			} else {
				item2 = item;
			}
		}else{ //item是新增加的对象
			item2 = item;
		}
		saveTemplatePageLayout(item2, loginUserId);
		return item2;
	}
	
	/** 插入或修改 页面布局类型 ，item中的所有属性都会更新到数据库中（包括属性值为null的，也会将null更新到数据库，覆盖之前的值）。
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public TemplatePageLayout saveTemplatePageLayout(TemplatePageLayout item, String loginUserId) throws Exception{
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		/*** 结束校验 ***/
		Date date = new Date();
		if (NumberUtil.isNullOrZero(item.getId())) {

			item.setId(null);
			item.setCreateTime(date);

		} else {

		}
		templatePageLayoutDao.saveTemplatePageLayout(item);
		return item;
	}
	
	/** 根据ID删除 页面布局类型 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void deleteTemplatePageLayout(Long id) throws Exception{
		TemplatePageLayout pageLayout = templatePageLayoutDao.getTemplatePageLayout(id);
		if(pageLayout == null)return;
		if("ADMIN".equals(pageLayout.getCreateUser()))throw new HException("内置布局不能删除");
		int codeTemplatesCount = codeTemplateService.getCodeTemplatesCountByLayout(id);
		if(codeTemplatesCount > 0) throw new HException("布局下还关联有源代码模板文件，不能删除");
		templatePageLayoutDao.deleteTemplatePageLayout(id);
	}
	
	/** property **/
	@Autowired
	private TemplatePageLayoutDao templatePageLayoutDao;
	
	@Autowired
	private CodeTemplateService codeTemplateService;
}
